// 练习1

// 实现一个convert函数(通过Object.defineProperty)
// 传入参数为一个浅层对象，要求可以为这个浅层对象添加getter和setter
// 并重新定义它的取值与设值行为
// getter和setter行为需要使用console.log来进行输出


function convert(obj: SimpleObject): SimpleObject {
    // 遍历所有的对象属性
    for (let key in obj) {
        let previousValue = obj[key];// 存储当前对象属性值，直接读存会导致无限循环
        // 设置getter、setter时注意通过闭包访问，不要直接读取，否则会造成死循环
        Object.defineProperty(obj, key, {
            get() {
                console.log(`你读取了当前对象的属性${previousValue}`);
            },
            set(newValue) {
                console.log(`你修改了当前对象的属性，旧值为${previousValue},新值为${newValue}`);
                previousValue = newValue;
            }
        });
    }
    return obj;
}

// 测试用例
const test_obj = convert({
    name: 'Leon',
    age: 18,
    isMale: true
});

test_obj.name;
test_obj.age;
test_obj.isMale;
test_obj.age = 81;
test_obj.name = "jack";
test_obj.isMale = false;
